import { GetServerSideProps, NextPage } from 'next'; import React, { useEffect } from 'react'; import dynamic from 'next/dynamic'; import cookie from 'cookie'; import { getProductById } from '~/services/product'; import { createSlug, getIdFromSlug } from '~/libs/slug'; // <-- tambahin createSlug import { IProductDetail } from '~/types/product'; import { Seo } from '~/components/seo'; import { useRouter } from 'next/router'; import { useProductContext } from '@/contexts/ProductContext'; const BasicLayout = dynamic( () => import('@/core/components/layouts/BasicLayout'), { ssr: false } ); const ProductDetail = dynamic(() => import('~/modules/product-detail'), { ssr: false, }); type PageProps = { product: IProductDetail; canonicalPath: string; }; export const getServerSideProps: GetServerSideProps = async ( context ) => { const { slug } = context.query; // ambil cookie pricelist tier const cookieString = context.req.headers.cookie; const cookies = cookieString ? cookie.parse(cookieString) : {}; const auth = cookies?.auth ? JSON.parse(cookies.auth) : {}; const tier = auth?.pricelist || ''; // ambil ID produk dari slug URL const productId = getIdFromSlug(slug as string); // fetch data produk dari backend lo const product = await getProductById(productId, tier); // hard guard: produk gak ada -> 404 if (!product) return { notFound: true }; // guard: gak ada varian harga valid -> 404 const hasValidVariant = Array.isArray(product.variants) && product.variants.some((v) => (v?.price?.price ?? 0) > 0); // if (!hasValidVariant) return { notFound: true }; // bikin canonical path yang BERSIH dan KONSISTEN dari data produk, // bukan dari URL request user (jadi gak ikut ?utm_source, ?ref=, dsb) const canonicalPath = createSlug( '/shop/product/', // ganti ini sesuai prefix route produk lo yang SEBENARNYA product?.name || '', product?.id, false // false = jangan include host di sini ); return { props: { product, canonicalPath, }, }; }; const ProductDetailPage: NextPage = ({ product, canonicalPath }) => { const router = useRouter(); const { setProduct } = useProductContext(); // taruh product di context global lo useEffect(() => { if (product) setProduct(product); }, [product, setProduct]); // rapihin origin biar gak double slash const origin = (process.env.NEXT_PUBLIC_SELF_HOST || '').replace(/\/+$/, ''); const pathClean = canonicalPath.startsWith('/') ? canonicalPath : `/${canonicalPath}`; const url = origin + pathClean; // optional: pastiin OG image absolute URL const ogImageUrl = product?.image?.startsWith('http') ? product.image : origin + product?.image; return (
); }; export default ProductDetailPage;